package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import model.Crianca;
import util.ConnectionFactory;

//permite a persistencia de dados na tabela criancas
public class CriancaDAO {
	
	//recebe um instancia de crianca e efetua a persistencia na base de dados
	public Integer save(Crianca crianca) {
		if (crianca.getCodigo() != null) {
			return update(crianca);
		} else {
			return insert(crianca);
		}
	}

	//insere um registro novo na tabela criancas
	private Integer insert(Crianca crianca) {
		String sql = "insert into criancas(nome, idade, telefone, nomePai, nomeMae) values(?,?,?,?,?)";
		Connection connection = null;
		PreparedStatement pStmt = null;
		ResultSet result = null;
		try {
			connection = ConnectionFactory.getConnection();
			pStmt = connection.prepareStatement(sql,
					Statement.RETURN_GENERATED_KEYS);

			pStmt.setString(1, crianca.getNome());
			pStmt.setInt(2, crianca.getIdade());
			pStmt.setString(3, crianca.getTelefone());
			pStmt.setString(4, crianca.getNomePai());
			pStmt.setString(5, crianca.getNomeMae());

			pStmt.executeUpdate();

			result = pStmt.getGeneratedKeys();

			if (result.next()) {
				return result.getInt(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionFactory.closeConnection(pStmt, result);
		}
		return null;
	}

	//atualiza um registro existente na tabela criancas
	private Integer update(Crianca crianca) {
		String sql = "update criancas set nome = ?, idade = ?, telefone = ?, nomePai = ?, nomeMae =? where id = ?";
		Connection connection = null;
		PreparedStatement pStmt = null;
		ResultSet result = null;
		try {
			connection = ConnectionFactory.getConnection();
			pStmt = connection.prepareStatement(sql,
					Statement.RETURN_GENERATED_KEYS);

			pStmt.setString(1, crianca.getNome());
			pStmt.setInt(2, crianca.getIdade());
			pStmt.setString(3, crianca.getTelefone());
			pStmt.setString(4, crianca.getNomePai());
			pStmt.setString(5, crianca.getNomeMae());
			pStmt.setInt(6, crianca.getCodigo());

			pStmt.executeUpdate();

			return crianca.getCodigo();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionFactory.closeConnection(pStmt, result);
		}
		return null;
	}

	//remove um registro da tabela criancas
	public Boolean delete(Integer id) {
		String sql = "delete from criancas where id = ?";
		Connection connection = null;
		PreparedStatement pStmt = null;
		try {
			connection = ConnectionFactory.getConnection();
			pStmt = connection.prepareStatement(sql);
			pStmt.setInt(1, id);
			return pStmt.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	//lista todos os registros da tabela criancas
	public List<Crianca> listAll() {
		String sql = "select id, nome, idade, telefone, nomePai, nomeMae from criancas";
		List<Crianca> criancas = new ArrayList<Crianca>();
		Connection connection = null;
		PreparedStatement pStmt = null;
		ResultSet result = null;
		try {
			connection = ConnectionFactory.getConnection();
			pStmt = connection.prepareStatement(sql);
			result = pStmt.executeQuery();
			while (result.next()) {
				Crianca crianca = new Crianca();
				crianca.setCodigo(result.getInt(1));
				crianca.setNome(result.getString(2));
				crianca.setIdade(result.getInt(3));
				crianca.setTelefone(result.getString(4));
				crianca.setNomePai(result.getString(5));
				crianca.setNomeMae(result.getString(6));
				criancas.add(crianca);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return criancas;
	}

	//registra a aplicacao da vacina na tabela vacinas_crianca
	public Boolean aplicarVacina(Integer crianca, Integer vacina) {
		String sql = "insert into vacinas_crianca(id_crianca,id_vacina) values(?, ?)";
		Connection connection = null;
		PreparedStatement pStmt = null;
		try {

			connection = ConnectionFactory.getConnection();
			pStmt = connection.prepareStatement(sql);
			pStmt.setInt(1, crianca);
			pStmt.setInt(2, vacina);
			return pStmt.execute();

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	//busca um registro da tabela criancas pelo identificador
	public Crianca find(Integer id) {
		String sql = "select id, nome, idade, telefone, nomePai, nomeMae from criancas where id = ?";
		Crianca crianca = new Crianca();
		Connection connection = null;
		PreparedStatement pStmt = null;
		ResultSet result = null;
		try {
			connection = ConnectionFactory.getConnection();
			pStmt = connection.prepareStatement(sql);
			pStmt.setInt(1, id);
			result = pStmt.executeQuery();
			if (result.next()) {

				crianca.setCodigo(result.getInt(1));
				crianca.setNome(result.getString(2));
				crianca.setIdade(result.getInt(3));
				crianca.setTelefone(result.getString(4));
				crianca.setNomePai(result.getString(5));
				crianca.setNomeMae(result.getString(6));

			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return crianca;
	}



}
